namespace ConsoleApp;

//在C#中，通常遵循一种命名约定，即使用大写字母开头的标识符来表示类型的成员（字段、属性、方法等）。这种命名约定被称为 PascalCase。
// 
// 因此，当你看到 FirstName 和 LastName 这样的标识符时，它们是按照这种命名约定命名的。这种约定有助于提高代码的可读性，因为它使得类型的成员在代码中更易于识别。这也是C#社区广泛接受的一种编码风格。
// 
// 在C#中，PascalCase通常用于表示类型的成员，而camelCase通常用于表示局部变量或参数。这种一致的命名约定有助于编写清晰、易读的代码，并且使得不同开发者之间更容易理解和共享代码。
public record Record(string FirstName, string LastName);

//这段代码定义了一个名为 Person 的record类型，它具有两个属性：FirstName 和 LastName。这些属性使用了C# 9.0中引入的初始化器（init-only properties）和required修饰符。
// 
// 让我们逐个解释这段代码：
// 
// public record Person：这里定义了一个名为 Person 的record类型，并且将其声明为公共的，这意味着它可以在程序的其他部分被访问到。
// 
// public required string FirstName { get; init; }：这部分定义了 Person 类型的 FirstName 属性。required修饰符表示这个属性在构造函数中是必须要初始化的，而init访问器表示这个属性可以在构造后被初始化，但之后就变为只读。这意味着一旦初始化后，FirstName 的值就不能再被修改。
// 
// public required string LastName { get; init; }：这部分定义了 Person 类型的 LastName 属性，其特性和行为与 FirstName 属性类似。
// 
// 因此，这段代码定义了一个具有两个必须初始化且只读的属性的record类型，用于表示人员信息，其中包括名字和姓氏。这种设计使得在创建 Person 实例时，必须提供 FirstName 和 LastName 的初始值，并且一旦初始化后，这些值就不能再被修改
public record Person1
{
    public Person1(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    // public required string FirstName { get; init; }
    public string FirstName { get; init; }

    // public required string LastName { get; init; }
    public string LastName { get; init; }
};

public readonly record struct Point(double X, double Y, double Z)
{
    // public double X { get; } = X;
    // public double Y { get; } = Y;
    // public double Z { get; } = Z;
}

public record struct Point1
{
    public double X { get; init; }
    public double Y { get; init; }
    public double Z { get; init; }
}

//public record Person：这里定义了一个名为 Person 的record类型，并且将其声明为公共的，这意味着它可以在程序的其他部分被访问到。
// 
// (string FirstName, string LastName, string Id)：这部分是record类型的主要构造函数参数列表。在这里，它定义了 Person 类型的构造函数，该构造函数接受三个参数：FirstName、LastName 和 Id。
// 
// internal string Id { get; init; } = Id;：这部分定义了 Person 类型的 Id 属性。internal关键字表示该属性只能在当前程序集内部访问。init访问器表示这个属性可以在构造后被初始化，但之后就变为只读。= Id部分表示在初始化时，将构造函数参数 Id 的值赋给 Id 属性。
// 
// 这段代码的作用是定义了一个record类型 Person，其中包含了 FirstName、LastName 和 Id 这三个属性。这些属性在构造对象时必须被初始化。同时，Id 属性在初始化后变为只读，并且在初始化时使用了相同名称的构造函数参数来赋值。
// 
// 需要注意的是，这段代码中存在一个潜在的问题：在record类型的主构造函数参数列表中已经定义了 Id，因此在record体内又定义了一个同名的属性 Id，这可能会导致混淆和错误。通常情况下，不建议在record类型中重新定义已经在构造函数参数列表中定义过的属性。
public record Person(string FirstName, string LastName, string Id)
{
    internal string Id { get; init; } = Id;
}